//
//  MZTimeTable.m
//  Mehfile Zainab
//
//  Created by Sitara Badourali on 29/04/12.
//  Copyright 2012 Mehfile Zainab. All rights reserved.
//

#define FAJR_NAMAZ_NAME		@"Fajr"
#define SUNRISE_NAMAZ_NAME	@"Lever du soleil"
#define ZOHR_NAMAZ_NAME		@"Zohr"
#define SUNSET_NAMAZ_NAME	@"Coucher du soleil"
#define MAGRIB_NAMAZ_NAME	@"Magrib"

#import "MZTimeTable.h"

@implementation MZTimeTable

@synthesize mzNamazDate;
@synthesize mzNamazDefinitionArray;
@synthesize mzNamazTimeDictionary;


- (id) init
{
    if ( self = [super init] )
    {
		
		mzNamazDefinitionArray	= [[NSMutableArray alloc] init];
		[mzNamazDefinitionArray addObject:FAJR_NAMAZ_NAME];
		[mzNamazDefinitionArray addObject:SUNRISE_NAMAZ_NAME];
		[mzNamazDefinitionArray addObject:ZOHR_NAMAZ_NAME];
		[mzNamazDefinitionArray addObject:SUNSET_NAMAZ_NAME];
		[mzNamazDefinitionArray addObject:MAGRIB_NAMAZ_NAME];
				
    }
    return self;
}

/*
- (NSMutableDictionary*) setNamazTimeDictionaryWithValuesArray:(NSMutableArray*)timeValues {

	mzNamazTimeDictionary = [[NSMutableDictionary alloc] init];
	for (NSUInteger i=0; i<[timeValues count]; i++) {
		[mzNamazTimeDictionary setValue:[timeValues objectAtIndex:i] forKey:[mzNamazDefinitionArray objectAtIndex:i]];
	}
	return mzNamazTimeDictionary;
	
}
*/

// Adapted method to take into account the +1/-1 time change in March and April
- (NSMutableDictionary*) setNamazTimeDictionaryWithValuesArray:(NSMutableArray*)timeValues {
    
	mzNamazTimeDictionary = [[NSMutableDictionary alloc] init];
	for (NSUInteger i=0; i<[timeValues count]; i++) {
        NSString *namazTime = [self changeNamazTimeIfNecessary:[timeValues objectAtIndex:i]];
		[mzNamazTimeDictionary setValue:namazTime forKey:[mzNamazDefinitionArray objectAtIndex:i]];
	}
	return mzNamazTimeDictionary;
	
}

- (BOOL) isCompriseInChangingTime:(NSDate *)dateToAnalyse {

    NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:dateToAnalyse];
    int weekday = [comps weekday];
    NSDate *nextSunday = [dateToAnalyse dateByAddingTimeInterval:3600*24*(-weekday+8)];
    NSLog(@"Date à analyser (NSDate) : %@", dateToAnalyse);
    NSLog(@"Prochain dimanche : %@", nextSunday);
    
    NSDateFormatter *MonthDateFormat = [[[NSDateFormatter alloc]init] autorelease];
    [MonthDateFormat setDateFormat:@"MMMM"];
    [MonthDateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]];
	[MonthDateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
	
	// If current date's month is the same as the next sunday's month
	// then next sunday is not last sunday of month
	// else the current date is between last sunday and end of month
    if ([[MonthDateFormat stringFromDate:dateToAnalyse] isEqualToString:[MonthDateFormat stringFromDate:nextSunday]])
    {
        NSLog(@"En dehors de la période de changement");
        return FALSE;
    } else {
        NSLog(@"Compris dans la période de changement");
        return TRUE;
    }

}

- (NSString*) changeNamazTimeIfNecessary:(NSString*)timeBeforeChange {
    
    NSLog(@"Date à analyser (NSString) : %@", mzNamazDate);

    NSDate *dateToAnalyse = [[NSDate alloc] init];
    
    NSDateFormatter *dateToAnalyseFormatter = [[NSDateFormatter alloc] init];
    [dateToAnalyseFormatter setDateFormat:@"dd MMMM yyyy"];
    [dateToAnalyseFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]];
    [dateToAnalyseFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    dateToAnalyse = [dateToAnalyseFormatter dateFromString:mzNamazDate];
    
    NSDateFormatter *monthDateFormat = [[[NSDateFormatter alloc]init] autorelease];
    [monthDateFormat setDateFormat:@"MMMM"];
    [monthDateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]];
	[monthDateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    NSString *dateToAnalyseMonth = [[monthDateFormat stringFromDate:dateToAnalyse] lowercaseString];
	
	NSLog(@"Mois analysé pour la date : %@", dateToAnalyseMonth);
	
	NSDateFormatter *hourDateFormat = [[[NSDateFormatter alloc]init] autorelease];
	// HH : pour la gestion horaire française 00h-24h
	[hourDateFormat setDateFormat:@"HH:mm"];
	[hourDateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]];
	[hourDateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
	
	NSDate *timeBeforeChangeDate = [hourDateFormat dateFromString:timeBeforeChange];
	NSDate *timeAfterChangeDate = [hourDateFormat dateFromString:timeBeforeChange];;
	
	// Pour le cadre des tests, cette condition n'est pas vérifiée
	// Ne pas oublier de la réactiver !!!
	if ([dateToAnalyseMonth isEqualToString:@"mars"]) {
		
		// Désactiver cette condition pour vérifier
		// que l'opération de décalage s'effectue correctement
		// Ne pas oublier de réactiver !!!
		if ([self isCompriseInChangingTime:dateToAnalyse]) {

			NSLog(@"Effectuer le décalage");
			timeAfterChangeDate = [timeBeforeChangeDate dateByAddingTimeInterval:3600];
			
		}
	
	}
	// Attention : +1h en mars et -1h en octobre
	// Ne pas oublier de distinguer ces deux cas!!!
	if ([dateToAnalyseMonth isEqualToString:@"octobre"]) {
		
		// Désactiver cette condition pour vérifier
		// que l'opération de décalage s'effectue correctement
		// Ne pas oublier de réactiver !!!
		if ([self isCompriseInChangingTime:dateToAnalyse]) {
			
			NSLog(@"Effectuer le décalage");
			timeAfterChangeDate = [timeBeforeChangeDate dateByAddingTimeInterval:-3600];
			
		}
		
	}
	
    dateToAnalyse = nil;
    [dateToAnalyseFormatter release];
    
    return [hourDateFormat stringFromDate:timeAfterChangeDate] ;
	
}

- (NSString*) getNamazDate {
	
	return self.mzNamazDate;

}

- (NSMutableDictionary*) getNamazTimeDictionary {
	
	return mzNamazTimeDictionary;
	
}

- (NSMutableArray*) getNamazDefinitionArray {

	return mzNamazDefinitionArray;

}

- (void) dealloc
{
	[mzNamazDate release];
    [mzNamazDefinitionArray release];
	[mzNamazTimeDictionary release];
    [super dealloc];
}

@end
